package co.edu.udea.herbario.dao.impl;

import co.edu.udea.herbario.dao.Conexion;
import co.edu.udea.herbario.dao.FamiliaDao;
import co.edu.udea.herbario.dto.Familia;
import co.edu.udea.herbario.exception.OrgSistemasDaoException;
import co.edu.udea.herbario.util.ConstantesStatic;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

/**
 *Esta clase contiene la implementación de los métodos planteados en la interface 
 * FamiliaDao,los cuales son utilizados para gestionar los datos de persistencia
 * asociados a las familias registradas en el sistema 
 *
 * @author Lorena Orozco
 */
public class FamiliaDaoImp implements FamiliaDao
{
    ResourceBundle consultasSQL;    //variable para obtener las consultas sql
    Connection con = null;          //variable para la conexion a la BD
    CallableStatement cs = null;    //variable para el llamado a las funciones de la BD
    ResultSet rs = null;            //variable para obtener el resultado de la consulta sql

    public FamiliaDaoImp()
    {
        consultasSQL = ResourceBundle.getBundle(ConstantesStatic.PROPERTIES_CONSULTAS);
        con = Conexion.obtenerInstancia().abrirConexion();
    }

    public Familia obtenerFamilia(int codigo)
    {
        Familia fam = new Familia();

        try
        {
            String consulta = consultasSQL.getString("obtenerFamilia");
            boolean retorno = false;
           
            cs = con.prepareCall(consulta);

            if(codigo > 0)
            {
                cs.setInt(1, codigo);
            }
            else
            {
                return fam;
            }
            
            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while(rs.next())
                {
                    fam.setCodigo(rs.getInt("codigo"));
                    fam.setNombre(rs.getString("nombre"));
                    fam.setFechaIngreso(rs.getDate("fecha_ingreso"));
                }
            }

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }

        return fam;
    }

    public Familia obtenerFamiliaPorNombre(String fami)
    {
        Familia fam = new Familia();
        
        try
        {
            String consulta = consultasSQL.getString("obtenerFamiliaPorNombre");
            boolean retorno = false;
            
            cs = con.prepareCall(consulta);

            if(fami != null && !"".equals(fami))
            {
                cs.setString(1, fami);
            }
            else
            {
                return fam;
            }
            
            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while(rs.next())
                {
                    fam.setCodigo(rs.getInt("codigo"));
                    fam.setNombre(rs.getString("nombre"));
                    fam.setFechaIngreso(rs.getDate("fecha_ingreso"));
                }
            }
            
            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }
        
        return fam;
    }

    public List<String> obtenerNombresFamilias(String valor)
    {
        List<String> nombresFamilias = new ArrayList<String>();
        
        try
        {
            String consulta = consultasSQL.getString("obtenerNombresFamilias");
            boolean retorno = false;
            
            cs = con.prepareCall(consulta);

            if(valor != null && !"".equals(valor))
            {
                cs.setString(1, valor);
            }
            else
            {
                return nombresFamilias;
            }
            
            retorno = cs.execute();

            if(retorno == true)
            {
                rs = cs.getResultSet();

                while(rs.next())
                {
                    String nombre = rs.getString("NOMBRE");
                    nombresFamilias.add(nombre);
                }
            }

            rs.close();
            cs.close();
        }
        catch (SQLException e)
        {
            new OrgSistemasDaoException(e.getMessage());
        }

        return nombresFamilias;
    }

    public int crearFamilia(Familia familia)
    {
        int res = 1;        
        return res;
    }

    public int actualizarFamilia(Familia familia)
    {
        int res = 1;
        return res;
    }    
}
